www.gusucode.com > VC++ 三维图形生成和察看工具 > VC++ 三维图形生成和察看工具/code/mesh/DialogWmf.cpp

    //Download by http://www.NewXing.com
// DialogWmf.cpp : implementation file
//

#include "stdafx.h"
#include "mesh.h"
#include "DialogWmf.h"

#include "MeshDoc.h"
#include "MeshView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDialogWmf dialog


CDialogWmf::CDialogWmf(CWnd* pParent /*=NULL*/)
	: CDialog(CDialogWmf::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDialogWmf)
	m_Ratio = 30.0;
	m_RatioNbFaces = 0.0f;
	//}}AFX_DATA_INIT
}

CDialogWmf::CDialogWmf(CWnd* pParent,
											 CMeshDoc *pDoc)
	: CDialog(CDialogWmf::IDD, pParent)
{
	m_pDoc = pDoc;
	m_ColorLine = RGB(0,0,0);
	m_ColorFace = RGB(255,255,255);
	m_Mode = MODE_LINE;
	m_Ratio = 30.0;
	m_RatioNbFaces = 1.0f;
}

//*********************************
// OnInitDialog 
//*********************************
BOOL CDialogWmf::OnInitDialog() 
{
	CDialog::OnInitDialog();
	((CButton *)GetDlgItem(IDC_RADIO_LINE))->SetCheck(1);
	((CButton *)GetDlgItem(IDC_RADIO_FACE))->SetCheck(0);
	// CG: The following block was added by the ToolTips component.
	{
		// Create the ToolTip control.
		m_tooltip.Create(this);
		m_tooltip.Activate(TRUE);

		m_tooltip.AddTool(GetDlgItem(IDC_EDIT_RATIO_NBFACES), "Enter the face number ratio (1.0 means that every face are taken into account)");
		m_tooltip.AddTool(GetDlgItem(IDC_EDIT_RATIO), "Select the scaling ratio (30.0 is default)");
		m_tooltip.AddTool(GetDlgItem(IDC_COLOR_FACE), "Click into this frame to select the face color");
		m_tooltip.AddTool(GetDlgItem(IDC_COLOR_LINE), "Click into this frame to select the line color");
		m_tooltip.AddTool(GetDlgItem(IDC_RADIO_FACE), "Faces are sorted according to z, filled and outlined");
		m_tooltip.AddTool(GetDlgItem(IDC_RADIO_LINE), "Edges are painted without sorting nor culling");
	}
	return TRUE;
}


void CDialogWmf::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDialogWmf)
	DDX_Control(pDX, IDC_COLOR_FACE, m_FrameFace);
	DDX_Control(pDX, IDC_COLOR_LINE, m_FrameLine);
	DDX_Text(pDX, IDC_EDIT_RATIO, m_Ratio);
	DDX_Text(pDX, IDC_EDIT_RATIO_NBFACES, m_RatioNbFaces);
	DDV_MinMaxFloat(pDX, m_RatioNbFaces, 1.e-003f, 1.f);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDialogWmf, CDialog)
	//{{AFX_MSG_MAP(CDialogWmf)
	ON_BN_CLICKED(ID_BUTTON_RUN, OnButtonRun)
	ON_WM_PAINT()
	ON_WM_LBUTTONUP()
	ON_BN_CLICKED(IDC_RADIO_FACE, OnRadioFace)
	ON_BN_CLICKED(IDC_RADIO_LINE, OnRadioLine)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDialogWmf message handlers

//*********************************
// OnButtonRun 
//*********************************
void CDialogWmf::OnButtonRun() 
{
	BeginWaitCursor();

	UpdateData(TRUE);

	// Get DC
	CDC *pDC = m_pDoc->GetView()->GetDC();
	ASSERT(pDC);

	// Get view rect
	CRect rect;
	m_pDoc->GetView()->GetClientRect(&rect);
	rect.InflateRect(5,5);

	// Create metafile device context
	HDC hMetaDC = CreateEnhMetaFile(pDC->m_hDC,"metafile.emf",NULL,NULL);
	if(!hMetaDC)
	{
		AfxMessageBox("Unable to create MetaFile");
		ReleaseDC(pDC);
		return;
	}

	// Get DC from handle
	CDC *pMetaDC = CDC::FromHandle(hMetaDC);
	ASSERT(pMetaDC);
	pMetaDC->SetMapMode(MM_TEXT); 

	// Position / translation / scale
	glPushMatrix();
	CMeshView *pView = (CMeshView *)m_pDoc->GetView();
	glTranslated(pView->m_xTranslation,pView->m_yTranslation,pView->m_zTranslation);
	glRotatef(pView->m_xRotation, 1.0, 0.0, 0.0);
	glRotatef(pView->m_yRotation, 0.0, 1.0, 0.0);
	glRotatef(pView->m_zRotation, 0.0, 0.0, 1.0);
	glScalef(pView->m_xScaling,pView->m_yScaling,pView->m_zScaling);

	// Get OpenGL parameters
	GLdouble modelMatrix[16];
	GLdouble projMatrix[16];
	GLint viewport[4];
	glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix);
	glGetDoublev(GL_PROJECTION_MATRIX,projMatrix);
	glGetIntegerv(GL_VIEWPORT,viewport);

	// Start rendering via std GDI 2D drawing functions
	CSceneGraph3d *pScene = &m_pDoc->m_SceneGraph;
	for(int i=0;i<pScene->NbObject();i++)
	{
		CObject3d *pObject = pScene->GetAt(i);
		if(pObject->GetType() == TYPE_MESH3D) // meshes only
			// The line mode (no sort)
			if(m_Mode == MODE_LINE) 
				((CMesh3d *)pObject)->glDrawProjectLine(pMetaDC,
				                                        modelMatrix,
																								projMatrix,
																								viewport,
																								m_ColorLine,
																								m_Ratio,
																								rect.Height());
			else 
				// The face mode (faces are z-sorted 
				// according to their barycenter)
				((CMesh3d *)pObject)->glDrawProjectFace(pMetaDC,
				                                        modelMatrix,
																								projMatrix,
																								viewport,
																								m_ColorLine,
																								m_ColorFace,
																								m_Ratio,
																								rect.Height(),
																								m_RatioNbFaces);
	}

	glPopMatrix();

	// Close metafile
	HENHMETAFILE hMetaFile = CloseEnhMetaFile(hMetaDC);

	// Fill the clipboard (direct sent to wmf2eps or 
	// any windows app such as Powerpoint)
	OpenClipboard();
	EmptyClipboard();
	SetClipboardData(CF_ENHMETAFILE,CopyEnhMetaFile(hMetaFile,NULL));
	CloseClipboard();

	// Cleanup
	DeleteEnhMetaFile(hMetaFile);
	ReleaseDC(pDC);

	EndWaitCursor();
}

void CDialogWmf::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	CRect rect;
	CBrush brush;
	
	// Line color
	m_FrameLine.GetWindowRect(&rect);	
	ScreenToClient(&rect);
	brush.CreateSolidBrush(m_ColorLine);
	dc.FillRect(&rect,&brush);
	brush.DeleteObject();

	// Face color
	m_FrameFace.GetWindowRect(&rect);	
	ScreenToClient(&rect);
	brush.CreateSolidBrush(m_ColorFace);
	dc.FillRect(&rect,&brush);
	brush.DeleteObject();
}

//*********************************
// OnLButtonUp 
//*********************************
void CDialogWmf::OnLButtonUp(UINT nFlags, CPoint point) 
{
	CRect rect;

	// Line color
	m_FrameLine.GetWindowRect(&rect);	
	ScreenToClient(&rect);
	if(rect.PtInRect(point))
	{
		CColorDialog dlg(m_ColorLine);
		if(dlg.DoModal()==IDOK)
		{
			m_ColorLine = dlg.GetColor();	
			InvalidateRect(&rect,FALSE);
		}
	}

	// Face color
	m_FrameFace.GetWindowRect(&rect);	
	ScreenToClient(&rect);
	if(rect.PtInRect(point))
	{
		CColorDialog dlg(m_ColorFace);
		if(dlg.DoModal()==IDOK)
		{
			m_ColorFace = dlg.GetColor();	
			InvalidateRect(&rect,FALSE);
		}
	}

	CDialog::OnLButtonUp(nFlags, point);
}

///////////////////////////////////
// Options (face or line)
///////////////////////////////////

//*********************************
// OnRadioFace 
//*********************************
void CDialogWmf::OnRadioFace() 
{
	m_Mode = MODE_FACE;
	((CButton *)GetDlgItem(IDC_RADIO_LINE))->SetCheck(0);
	((CButton *)GetDlgItem(IDC_RADIO_FACE))->SetCheck(1);
}

//*********************************
// OnRadioFace 
//*********************************
void CDialogWmf::OnRadioLine() 
{
	m_Mode = MODE_LINE;
	((CButton *)GetDlgItem(IDC_RADIO_LINE))->SetCheck(1);
	((CButton *)GetDlgItem(IDC_RADIO_FACE))->SetCheck(0);
}



BOOL CDialogWmf::PreTranslateMessage(MSG* pMsg)
{
	// CG: The following block was added by the ToolTips component.
	{
		// Let the ToolTip process this message.
		m_tooltip.RelayEvent(pMsg);
	}
	return CDialog::PreTranslateMessage(pMsg);	// CG: This was added by the ToolTips component.
}